home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Tools / Dev / Sas-PPC / examples / calc.c next >
Encoding:
C/C++ Source or Header  |  1999-12-03  |  5.2 KB  |  230 lines

  1. #include <string.h>
  2. #include <ctype.h>
  3. #include <stdio.h>
  4. #include <fcntl.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <workbench/startup.h>
  8. #include <libraries/dos.h>
  9. #include <libraries/dosextens.h>
  10. #include <proto/dos.h>
  11. #include <proto/exec.h>
  12.  
  13.  
  14. void prtnum(double num,int mode);
  15. double getnum(char *buff,int mode);
  16.  
  17. char format[100] = "%16.16e\n";
  18.  
  19. void main()
  20. {
  21.    char linebuff[80];
  22.    char *buff;
  23.    int mode = 0,noprint;   /* 0 = x, 1 = decimal, 2 = binary */
  24.    double result;
  25.    double result2,result3, result4;
  26.    long input;
  27.    
  28.    input = Input();
  29.    if (input == NULL) return;
  30.  
  31. result = result2 = result3 = result4 = 0.0;      
  32.  
  33.  while(1)
  34.  {
  35. looptop:
  36.    memset(linebuff,'\0',79);
  37.    if (Read(input, linebuff, 79) == 0 || *linebuff == 'q')
  38.    {
  39.       return;
  40.    }
  41.    buff = linebuff;
  42.    while(*buff)
  43.    {
  44.       noprint = 0;
  45.       while(*buff == ' ') buff++;
  46.       switch(toupper(*buff))
  47.       {
  48.          case 0: 
  49.             break;
  50.          case 'i':
  51.          case 'I':
  52.             result = 1/ result;
  53.             break;
  54.          case '!':
  55.             result = -result;
  56.             break;          
  57.          case '|':
  58.             result = (double)((long)result2|(long)result);
  59.             result2 = result3;
  60.             result3 = result4;
  61.             break;          
  62.          case '&':
  63.             result = (double)((long)result2&(long)result);
  64.             result2 = result3;
  65.             result3 = result4;
  66.             break;          
  67.          case '/':
  68.             result = result2/result;
  69.             result2 = result3;
  70.             result3 = result4;
  71.             break;          
  72.          case '*':
  73.             result = result2*result;
  74.             result2 = result3;
  75.             result3 = result4;
  76.             break;          
  77.          case '-':
  78.             result = result2- result;
  79.             result2 = result3;
  80.             result3 = result4;
  81.             break;          
  82.          case '+':
  83.             result = result2+result;
  84.             result2 = result3;
  85.             result3 = result4;
  86.             break;
  87.          case 'S':
  88.             prtnum(result4,mode);
  89.             prtnum(result3,mode);
  90.             prtnum(result2,mode);
  91.             break;
  92.          case 'M':
  93.             buff++;
  94.             switch(toupper(*buff))
  95.             {
  96.            case 'F':
  97.               strcpy(format, buff+1);
  98.           buff += strlen(buff);
  99.           break;
  100.                case 'P':
  101.                   mode = 3;
  102.                   break;
  103.                case 'X':   
  104.                case 'H':
  105.                   mode = 0;
  106.                   break;
  107.                case 'D':
  108.                   mode = 1;
  109.                   break;
  110.                case 'B':
  111.                   mode = 2;
  112.                   break;
  113.             }
  114.             break;
  115.          case '?':
  116.             printf("MH  - hex mode\n");
  117.             printf("MD  - decimal mode\n");
  118.             printf("MB  - binary mode\n");
  119.             printf("MP  - Hex pattern of double\n");
  120.             printf("MF  - Specify decimal output format\n");
  121.             printf("S   - print stack\n");
  122.             printf("+   - Addition\n");
  123.             printf("-   - Subtraction\n");
  124.             printf("*   - Multiplication\n");
  125.             printf("/   - Division\n");
  126.             printf("&   - Bitwise AND\n");
  127.             printf("|   - Bitwise OR\n");
  128.             printf("!   - Negation\n");
  129.             printf("i   - Inverse (1/x)\n"); 
  130.             break;
  131.          
  132.          default:
  133.             result4 = result3;
  134.             result3 = result2;
  135.             result2 = result;
  136.             if (strlen(buff)>1)
  137.                result = getnum(buff,mode);
  138.             noprint = 1;
  139.       }
  140.       if (!noprint) prtnum(result, mode);
  141.       while(*buff != ' ' && *buff != '\0') buff++;
  142.    }
  143.  }   
  144. }
  145.  
  146. double getnum(buff, mode)
  147. char *buff;
  148. int mode;
  149. {
  150.    unsigned long ret;
  151.    char *p;
  152.    double ret2;
  153.    unsigned long *d = (long *)&ret2;
  154.    char buff2[256];
  155.    
  156.    switch(mode)
  157.    {
  158.       case 0:
  159.          stch_l(buff, (long *)&ret);
  160.          ret2 = ret;
  161.          break;
  162.       case 1:
  163.          sscanf(buff, "%le",&ret2);
  164.          break;
  165.       case 2:
  166.          p = buff;
  167.          ret = 0;
  168.          while(*p == '0' || *p == '1')
  169.          {
  170.             ret = (ret << 1) + (*p - '0'); 
  171.             p++;
  172.          }
  173.          ret2 = ret;
  174.          break;      
  175.       case 3:
  176.          strcpy(buff2,buff);
  177.          buff2[8] = 0;
  178.          stch_l(buff2, (long *)d);
  179.          strcpy(buff2,buff);
  180.          ret = 8;
  181.          while (buff[ret] && buff[ret]== ' ')
  182.          {
  183.             buff[ret] = 'z';
  184.             ret++;
  185.          }
  186.          stch_l(&buff[ret], (long *)(d+1));
  187.          break;
  188.  
  189.    }
  190.    return ret2;
  191. }
  192.  
  193. void prtnum(num, mode)
  194. double num;
  195. int mode;
  196. {
  197.    char buff[33];
  198.    int i;
  199.    unsigned long num2;
  200.    unsigned long *l;
  201.    
  202.    buff[32] = 0;
  203.    switch(mode)
  204.    {
  205.       case 0:
  206.          if (num > 0)
  207.            printf("%x\n",(unsigned long)num);
  208.          else
  209.            printf("%x\n",(long)num);
  210.          break;
  211.       case 1:
  212.          printf(format,num);
  213.          break;
  214.       case 2:
  215.          num2 = num;
  216.          for (i = 31; i >= 0; i--)
  217.          {
  218.             if (num2 & (1<<i)) buff[31 - i] = '1';
  219.             else buff[31 - i] = '0';
  220.          }
  221.          printf("%s\n",buff);
  222.          break;      
  223.       case 3:
  224.          l = (long *)#
  225.          printf("%x %x\n",*l,*(l+1));
  226.          break;
  227.    }
  228. }
  229.  
  230.